package com.woniuxy.portal.task;

import com.woniuxy.common.consts.BookConst;
import com.woniuxy.common.consts.RedisConst;
import com.woniuxy.portal.model.entity.BookType;
import com.woniuxy.portal.service.BookService;
import com.woniuxy.portal.service.BookTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;

@Component
public class BookMallTask {

    private final RedisTemplate<String, Object> redisTemplate;
    private final BookService bookService;
    private final BookTypeService bookTypeService;

    @Autowired
    public BookMallTask(RedisTemplate<String, Object> redisTemplate, BookService bookService, BookTypeService bookTypeService) {
        this.redisTemplate = redisTemplate;
        this.bookService = bookService;
        this.bookTypeService = bookTypeService;
    }

    /**
     * 定时执行数据同步任务
     * 该方法通过定时调度，定期从MySQL数据库同步热销图书数据和分类数据到Redis缓存中
     * 主要功能包括：
     * 1. 清除并重新同步热销图书数据
     * 2. 清除并重新同步图书分类数据
     * 3. 同步每个分类下的图书数据
     * <p>
     * 调度频率：每30秒执行一次
     */
    @Scheduled(cron = "0/30 * * * * ?")
    public void execute() {
        // 1、同步热销数据：
        // 清除Redis中所有热销图书列表缓存
        Set<String> keys = redisTemplate.keys(RedisConst.BOOK_LIST + "*");
        keys.forEach(redisTemplate::delete);
        // 重新从MySQL查询热销数据并存入Redis
        bookService.findTopSale(BookConst.FIRST_PAGE, BookConst.PAGE_SIZE);

        // 2、同步分类数据
        // 清除Redis中所有图书分类列表缓存
        redisTemplate.delete(redisTemplate.keys(RedisConst.BOOK_TYPE_LIST + "*"));
        // 重新从MySQL查询分类数据并存入Redis
        List<BookType> typeList = bookTypeService.findAllType();

        // 3、查询每个类别下的图书
        // 遍历所有分类，同步每个分类下的图书数据到Redis
        typeList.forEach(type -> {
            bookService.findByType(BookConst.FIRST_PAGE, BookConst.PAGE_SIZE, type.getId());
        });
    }

}
